package Thread;

import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author 逸尘风清
 * @date 2021/4/27
 * @time 15:31
 * 描述：
 */
public class CAS {
    /**
     * CAS（无锁优化，自旋）
     * compare and set 比较并设置
     * （Object，Expected，NewValue）
     * 原理: 假设有个变量a，此时a = 3，期望值也是 3. 线程1准备去修改这个值，那么它就会去先去获取a的值，如果获得的a值和期望值一样，那么就可以进行值的改变
     * 如果在获取之前线程2将a的值改成了4，那么a获取到的值就是4和期望值3不相等，那么线程一就会再次自旋，更改期望值为4，然后再去获取a值和期望值对比，一样才会去更改a值
     * CPU原语支持
     * 下面改进的方法，不再使用volatile和synchronized实现线程安全。  Atomic自带的线程安全原子性，都是基于Unsafe类中的CAS
     */

    // volatile int count = 0;
    AtomicInteger count = new AtomicInteger(0);
    public /*synchronized*/ void m(){
        for (int i = 0; i < 10000; i++) {
            // count++;
            count.incrementAndGet();
        }
    }

    public static void main(String[] args) {
        CAS volatile2 = new CAS();
        // 创建线程列表
        List<Thread> threadList = new LinkedList<>();
        // 添加10个线程
        for (int i = 0; i < 10; i++) {
            threadList.add(new Thread(volatile2::m, "thread" + i));
        }
        threadList.forEach((o)->o.start());  // 循环开启线程
        threadList.forEach((o)->{
            try {
                o.join(); // 在线程里面加入线程
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        System.out.println(volatile2.count);
    }
}
